对象所有权

到目前为止,您已经探索了对象的所有基础知识以及如何使用它们。我们为您保持动力而感到自豪。现在,在本课程中,我们将探索不同的对象所有权方法,这将帮助您定义对象的安全性。

对象所有权

对象所有权定义了在进行交易时如何使用对象。对象所有权有多种类型。这是这些。

  1. 地址拥有
  2. 动态字段
  3. 不可变的
  4. 共享
  5. 嵌套

让我们一一详细探讨它们。

地址拥有

地址拥有的对象是由32字节地址拥有的对象,可以是帐户地址或对象ID。所有者是唯一有权访问它的人。您可以通过以下两种方式创建地址拥有的对象。

#![allow(unused)]
fn main() {
sui::transfer::transfer(obj: T, recipient: address)
sui::transfer::public_transfer(obj: T, recipient: address)
}
  1. 如果您要为对象定义自定义传输策略,请使用 sui::transfer::transfer 函数,这意味着它仅具有 key 能力,没有 store 能力。
  2. 如果对象具有 store 能力,则使用 sui::transfer::public_transfer 创建地址拥有的函数。

当您只想拥有该对象的一个所有者时,可以使用地址拥有的对象。

不可变对象

不可变对象是不可变的,这意味着它没有所有者,不能转让给任何人,也不能删除。以下是如何使对象不可变。

#![allow(unused)]
fn main() {
public native fun public_freeze_object(obj: T)
}

对象成为不可变对象后,就无法使其可变。但是,您可以使用对 entry 函数的不可变引用将其作为只读对象作为参数传递给函数。

共享对象

共享对象是每个人都可以访问的对象。与地址拥有的对象相比,共享对象可以被网络上的任何人访问。以下是创建共享对象的方法。

#![allow(unused)]
fn main() {
transfer::share_object(obj: T)
}

嵌套

与许多编程语言一样,您可以在另一个 struct 内部使用 struct 类型实例。以下是您可以如何做到这一点。

#![allow(unused)]
fn main() {
struct Foo has key {
    id: UID,
    bar: Bar,
}

struct Bar has store {
    value: u64,
}
}

这里,具有 key 能力的 Foo Sui 对象有一个具有 Bar 数据类型的实例 bar ,它是一个 struct 。这里, Bar 不是Sui对象,因为它没有 key 能力。您可以将其设为 Sui 对象并在 Foo 中使用它。

我们将在接下来的课程中了解有关对象包装的更多信息。

动态对象字段

有多种方法可以使用对象字段来存储不同类型的数据。但它有几个缺点:

  1. 发布模块时,对象具有一组固定的字段,由 struct 声明中的键标识。
  2. 一个对象包裹多个其他对象可能会增加 Gas 费,并且有大小限制。
  3. 使用 Move vector 类型不可能存储不同类型的对象集合,因为它需要单一类型 <T>

这就是动态字段发挥作用的地方。

总结

我们为您详细了解这些物体而感到自豪。接下来,我们将详细解释“Hello World”程序,然后我们将评估如何在 Move on Sui 上编写您自己的智能合约

quiz

在 Move on Sui 中定义了对象所有权的概念,并概述了五种类型的对象所有权方法:地址拥有、动态字段、不可变、共享和包装。